原理
加壳原理
加固的过程中需要三个对象:
- 需要加密的Apk(源Apk)
- 壳程序Apk(负责解密Apk工作)
- 加密工具(将源Apk进行加密和壳Dex合并成新的Dex)
主要步骤:
- 用加密算法对源Apk进行加密,形成加密的DEX文件
- 将加密的DEX文件与壳Apk进行合并得到新的Dex文件
- 用新的Dex文件替换壳程序中的dex文件,得到新的Apk。修改壳程序dex文件头中的checksum、signature 和file_size的信息,并且要附加加壳的apk的长度信息在dex文件中,以便我们进行解壳保证原来apk的正常运行。加完壳后整个文件的结构如下:
这个新的Apk叫作脱壳程序Apk,已经不是一个完整意义上的Apk程序了,他的主要工作是:负责解密源Apk,然后加载Apk,让其正常运行起来。
脱壳原理
通过反射置换android.app.ActivityThread 中的mClassLoader为加载解密出APK的DexClassLoader,该DexClassLoader一方面加载了源程序、另一方面以原mClassLoader为父节点,这就保证了即加载了源程序又没有放弃原先加载的资源与系统代码。
找到源程序的Application,通过反射建立并运行。这里需要注意的是,我们现在是加载一个完整的Apk,让他运行起来,那么我们知道一个Apk运行的时候都是有一个Application对象的,这个也是一个程序运行之后的全局类。所以我们必须找到解密之后的源Apk的Application类,运行的他的onCreate方法,这样源Apk才开始他的运行生命周期。这里我们如何得到源Apk的Application的类呢?这个我们后面会说道。使用meta标签进行设置。
产品化方案
国内提供APK加固技术方案的第三方技术公司有:娜迦、爱加密、梆梆加固、360加固、百度加固、腾讯加固等。
功能概述及其使用
阿里聚安全 链接:http://jaq.alibaba.com/
- 上传应用
- 提供安全扫描(漏洞扫描、恶意代码扫描、仿冒应用扫描)
- 可以从结果知道漏洞总数,如果是认证过的开发者,可以直接得知漏洞的具体位置。其中还有部分漏洞需要付费扫描。
- 然后我们可以进行应用加固,其中分快速加固和多渠道加固,可以按需选择 加固包下载(应用需要重新签名)
腾讯云应用乐固 链接:https://www.qcloud.com/product/cr
- 上传应用
- 默认服务类型:
- 应用加固
- 漏洞检测
- 渠道监控
- 可选服务类型:
- 适配分析(每天可以有一次)
- 质量跟踪(即接入腾讯的bugly进行异常追踪)
- 之后我们可以得到应用的基本信息、加固包、缺陷分析、应用检测
- 选择下载加固包(应用需要重新签名)的同时还提供了签名及多渠道打包工具、自动加固工具的下载使用
360加固保 链接:http://jiagu.360.cn/
- 上传应用
- 提供加固基础服务:
- DEX文件加密
- 防二次打包
- APK大小优化
- 防DEX内存截取
- 应用盗版检测
- 加固数据分析服务
- 可选增强服务:
- 崩溃日志分析(即接入360的bug追踪)
- 支持x86框架(约增大apk大小400k左右)
梆梆加固 链接:https://dev.bangcle.com/
- 上传应用
- 提供功能:安全评估(更多定制化的评估,需联系客户并且收费)、应用加固(认证过的开发者还提供:报告下载,多渠道打包)
- 评估结果提供了风险的详情,位置及解决方案
- 提供对加固后的包再进行快速评估
- 选择下载加固包(应用需要重新签名)的同时还提供了加固工具的下载使用
爱加密 链接:http://safe.ijiami.cn/
- 上传应用并直接执行加密.需要注意其中有一个选项:防止二次打包,请按需选择
- 可以对加固后的包申请渠道检测,除了加固包的下载,还提供了签名工具的下载荐
对比分析
体积(体积小的为优):360 > 腾讯 > 爱加密 > 阿里 > 梆梆
兼容性: 阿里 > 腾讯 > 360 = 梆梆 > 爱加密
启动速度(时间短为优): 阿里 > 爱加密 > 360 = 梆梆 > 腾讯
漏洞: 腾讯 > 爱加密 > 360 > 梆梆 > 阿里
参考资料
http://blog.csdn.net/jiangwei0910410003/article/details/48415225
http://blog.csdn.net/u011216417/article/details/70307031
http://xhrong.github.io/attachments/基于Android平台的软件加固方案的设计与.pdf